/*-*
 * FILENAME  :
 *    $HeadURL$
 *
 * STATUS  :
 *    $Revision$
 *
 *    $Author$
 *    $Date$
 *  
 *    
 * Copyright (c) 2011 Gonalge Ltda. All rights reserved.
 *
 ****************************************************************/

package org.gonalge.rompecabeza.servidor;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.List;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.gonalge.rompecabeza.dto.Conexion;
import org.gonalge.rompecabeza.negocio.Juego;
import org.gonalge.rompecabeza.pintado.PintarServidor;
import org.gonalge.rompecabeza.remoto.imp.Servidor;
import org.gonalge.rompecabeza.util.FormUtils;
import org.gonalge.rompecabeza.util.ShowMessage;

/**
 * 
 * @author Geremias Gonzalez
 */
public class FormServidor extends JFrame implements ActionListener {

    /**
     * 
     */
    private static final long serialVersionUID = 884529512427997199L;

    private static final Log LOG = LogFactory.getLog(FormOpciones.class);

    private final Conexion conexion = new Conexion();

    private final JPanel opcionePanel = new JPanel(new BorderLayout());;

    private final JPanel centroPanel = new JPanel(new BorderLayout());

    private final JPanel listaPanel = new JPanel(new BorderLayout());

    private final JLabel listaUsuarioLabel = new JLabel("Lista de Usuarios");

    private final PintarServidor dibujo = new PintarServidor(this);;

    private final List listaUsuario = new List(1);

    private final JButton cambiarImgButton = new JButton("OPCIONES DE JUEGO");

    private final JButton empezarButton = new JButton("NUEVO JUEGO");

    private final FormOpciones ayuda = new FormOpciones(this);

    private Juego juego = null;

    private int fil = 3, col = 3, img = 1;

    private Servidor server = null;

    private final Final fin = new Final();;

    public FormServidor() {
        try {
            jbInit();
        } catch (Exception e) {
            LOG.error("General ", e);
        }
    }

    private void jbInit() throws Exception {
        this.getContentPane().setLayout(new BorderLayout());
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setTitle("Servidor");

        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                avandonarJuego();
            }
        });

        Rectangle rec = FormUtils.centarRectangle(750, 400);
        this.setBounds(rec.x, rec.y, 450, 400);

        addObjetos();
        addEventos();
        lanzarServicio();
    }

    private void addObjetos() {

        fin.start();
        setResizable(false);
        setUndecorated(false);
        cambiarImgButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
        empezarButton.setCursor(new Cursor(Cursor.HAND_CURSOR));

        listaUsuarioLabel.setForeground(FormUtils.getColorTitulo());
        listaPanel.add(listaUsuarioLabel, BorderLayout.NORTH);
        listaPanel.add(listaUsuario, BorderLayout.CENTER);

        opcionePanel.add(cambiarImgButton, BorderLayout.SOUTH);
        opcionePanel.add(empezarButton, BorderLayout.CENTER);

        centroPanel.add(dibujo, BorderLayout.CENTER);
        centroPanel.add(opcionePanel, BorderLayout.SOUTH);

        this.getContentPane().add(listaPanel, BorderLayout.LINE_START);
        this.getContentPane().add(centroPanel, BorderLayout.CENTER);

    }

    private void addEventos() {
        empezarButton.addActionListener(this);
        cambiarImgButton.addActionListener(this);

    }

    // ************METODOS*REMOTOS***********

    private void lanzarServicio() {
        try {
            LocateRegistry.createRegistry(conexion.getPuerto());
            server = new Servidor(listaUsuario);
            Naming.rebind(conexion.getURL(), server);
            setTitle("Servicio iniciado: " + conexion.getURL());

        } catch (Exception e) {
            ShowMessage.servicioNoLanzado();
            LOG.error("lanzarServicio", e);
            System.exit(0);
        }
    }

    public void nuevoJuego(boolean sw) {
        if (juego == null) {
            juego = new Juego();
        }
        juego.setImagen(img);
        juego.nuevoJuego(fil, col);
        server.enviarJuego(sw, juego);
        dibujo.repaint();

    }

    private void initEmpesar() {
        if (juego == null) {
            nuevoJuego(true);
        } else {
            if (JOptionPane.showConfirmDialog(new JFrame(), "Desea Jugar una Nueva Partida", "NUEVO JUEGO", 2, 2) == 0)
                nuevoJuego(false);
        }
        repaint();
    }

    public void setConfirmarJuego(int f, int c, int img) {

        if (juego != null) {
            if (JOptionPane.showConfirmDialog(new JFrame(), "Desea Jugar una Nueva Partida", "NUEVO JUEGO", 2, 2) == 0)
                nuevoJuego(false);
            else {
                setImagen(img);
                setFilCol(f, c);
            }
        }
    }

    private void terminar() {
        if (server != null) {
            if (JOptionPane.showConfirmDialog(new JFrame(), "Desea Terminar la Partida", "TERMINAR LA PARTIDA", 2, 2) == 0) {
                setTitle("");
                server.terminarServicio();
                System.exit(0);
            }
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if (e.getSource().equals(cambiarImgButton)) {

            ayuda.setOpciones(fil, col, img);
            dibujo.setImagen(img);
            dibujo.setFilCol(fil, col);
            ayuda.setVisible(true);
        } else if (e.getSource().equals(empezarButton)) {
            if (server != null)
                initEmpesar();
            else
                JOptionPane.showMessageDialog(new JFrame(), "El Servicio no ha sido iniciado", "Advertencia!!", 2);
        }

    }

    public void setImagen(int img) {
        this.img = img;
        dibujo.setImagen(img);
    }

    public void setFilCol(int f, int c) {
        fil = f;
        col = c;
        dibujo.setFilCol(f, c);
    }

    public Juego getJuego() {
        return juego;
    }

    public Servidor getServer() {
        return server;
    }

    public PintarServidor getDibujo() {
        return dibujo;
    }

    private void avandonarJuego() {
        if (server != null)
            terminar();
        else {
            if (JOptionPane.showConfirmDialog(new JFrame(), "Desea Terminar la Partida", "TERMINAR LA PARTIDA", 2, 2) == 0)
                System.exit(0);
        }
    }

    public int getFil() {
        return fil;
    }

    public int getCol() {
        return col;
    }

    public int getImg() {
        return img;
    }

    private class Final extends Thread {

        boolean sw = true;

        @Override
        public void run() {
            try {
                while (sw) {
                    sleep(500);
                    if (juego != null) {
                        if (juego.finJuego()) {
                            dibujo.repaint();
                            sw = false;
                        }
                    }
                }
            } catch (Exception e) {
                LOG.error("run ", e);
            }
        }
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("de.muntjak.tinylookandfeel.TinyLookAndFeel");
            new FormServidor().setVisible(true);
        } catch (Exception e) {
            LOG.error("main ", e);
        }
    }
}
